		 --------------------------------
		   CrackMe [id:9] coded by tC...
		 Tutorial de Lucifer48, 21 mai 99
		 --------------------------------

Difficult: 3/10 (pour donner une ide:  8+ vous tes une lite ;)
Type de protection: Unlock code + Serial/Name

Encore du delphi pour ce crackme de 324 ko.

==============
1. UNLOCK CODE
==============

Lorsque le bon code est entr, le menu register est re-enabl.
Donc on en dduit que la procdure de vrification est teste aprs chaque touche appuye.
Comme d'habitude, un bpx hmemcpy nous permet de rentrer facilement dans le code.

XXXX:004442F7  E898F9FDFF     CALL 00423C94
XXXX:004442FC  8B45FC         MOV  EAX,[EBP-04]       ;notre unlock-code
XXXX:004442FF  BA88434400     MOV  EDX,00444388       ;tient, tient ...
XXXX:00444304  E83BF8FBFF     CALL 00403B44           ;CALL de comparaison (classique...)
XXXX:00444309  7507           JNZ  00444312           ;si jmp: le code entr n'est pas le bon
XXXX:0044430B  E8BCFFFFFF     CALL 004442CC           ;A explorer
XXXX:00444310  EB4D           JMP  0044435F           ;saut vers fin de la routine
XXXX:00444312  833D4C68440002 CMP  DWORD PTR [0044684C],02
XXXX:00444319  7544           JNZ  0044435F           ;saut vers fin de la routine
XXXX:0044431B   ...
re-enable le menu Register

-------------------------------------------------------------------------------
XXXX:00444388 43 72 61 63 6B 4D 65 20-5B 69 64 3A 39 5D 20 62  CrackMe [id:9] b
XXXX:00444398 79 20 74 43 2E 2E 2E 20-2E 00 00 00              y tC... ....
-------------------------------------------------------------------------------

Remarque: Le call 004442CC contient une unique instruction,  savoir:
          MOV DWORD PTR [0044684C],00000002

Rsumons nous: pour dloquer le menu Register:
1) On doit d'abort mettre le bon unlockcode  savoir:
   CrackMe [id:9] by tC... .
2) Mettre un mauvais unlockcode (car DWORD PTR [0044684C] vaut 2) pour pouvoir continuer en
   0044431B... Quand je dis "mettre un mauvais unlockcode" a veut dire appuyer sur une touche
   pour que le code ne soit plus valide. 
Pour rsumer: j'entre d'abord "CrackMe [id:9] by tC... ." et j'appuie sur une touche. Le menu est
alors dbloqu.

======================
2. SERIAL/NAME : INTRO
======================

J'entre les infos suivantes:
Your Name/ Lucifer48
 Reg. No./ 36157800

Encore une fois le bpx hmemcpy nous sert  rentrer dans le code :)
Nous somme ici:

XXXX:00444779  E816F5FDFF     CALL 00423C94           ;on sort d'ici
XXXX:0044477E  8B55F8         MOV  EDX,[EBP-08]       ;serial
XXXX:00444781  B868664400     MOV  EAX,00446868
...
XXXX:00444799  8B45F8         MOV  EAX,[EBP-08]       ;mon nom
XXXX:0044479C  E893F2FBFF     CALL 00403A34           ;call qui calcule la taille (rsultat EAX)
XXXX:004447A1  83F805         CMP  EAX,05
XXXX:004447A4  0F88CFB000000  JL   004448A5

On continue (on tombe sur une premire boucle):

XXXX:004447F6  BB70684400     MOV  EBX,00446870       ;petit buffer qui recevra notre serial encod
XXXX:004447FB  8D55F8         LEA  EDX,[EBP-08]       ;d *edx : mon nom
XXXX:004447FE  8B86C8020000   MOV  EAX,[ESI+000002C8]
XXXX:00444804  E88BF4FDFF     CALL 00423C94           ;longueur de la chaine argument (en EAX)
XXXX:00444809  8B45F8         MOV  EAX,[EBP-08]       ;mon nom
XXXX:0044480C  8B55FC         MOV  EDX,[EBP-04]       ;initialement [EBP-04]=00000001
XXXX:0044480F  8A4410FF       MOV  AL,[EDX+EAX-01]    ;charge le EDX-1 me caractre
XXXX:00444813  3403           XOR  AL,03
XXXX:00444815  8803           MOV  [EBX],AL           ;sauvegarde (temporaire) du rsultat
XXXX:00444817  33C0           XOR  EAX,EAX
XXXX:00444819  8A03           MOV  AL,[EBX]
XXXX:0044481B  8B1594684400   MOV  EDX,[00446894]     ;initialement [00446894]=00000000
XXXX:00444821  03D2           ADD  EDX,EDX
XXXX:00444823  03C2           ADD  EAX,EDX
XXXX:00444825  A394684400     MOV  [00446894],EAX     ;sauvegarde
XXXX:0044482A  A070684400     MOV  AL,[00446870]
XXXX:0044482F  F62D54684400   IMUL BYTE PTR [00446854] ;en [00446854]: longueur du nom (moi c 9)
XXXX:00444835  0003           ADD  [EBX],AL
XXXX:00444837  33C0           XOR  EAX,EAX
XXXX:00444839  8A03           MOV  AL,[EBX]
XXXX:0044483B  010598684400   ADD  [00446898],EAX     ;contiendra une somme
XXXX:00444841  FF45FC         INC  DWORD PTR [EBP-04] ;boucle suivante
XXXX:00444844  43             INC  EBX                ;caractre suivant
XXXX:00444845  4F             DEC  EDI
XXXX:00444846  75B3           JNZ  004447FB           ;boucle

Qu'est-ce qui ce passe ? (tentative d'explication)
Pour le premier caractre:
00446894: valeur ascii du 1er caractre XOR 3 (pour moi: 4C XOR 03 = 4F)
00446898: (valeur ascii du 1er caractre XOR 3)*(longueur du nom +1)
          remarque: on ne garde que les 8 bits de poids faible.
          Exemple pour moi: 4F * A = 316 donc 16=Z.
Caractres suivants:
lecture du Xme caractre, X XOR 03 = Y
00446894: Y+2*([00446894])
00446898: Z*(longeur nom)+Y (on ne garde que les 8 bits de poids faible) +[00446898]

Rsultat pour moi:
-------------------------------------------------------------------------------
XXXX:00446870 16 3C 26 30 2B 2C 37 FD-01                       .<&0+,7..
XXXX:00446880
XXXX:00446890             2D BB 00 00-34 02 00 00                 -...4...
-------------------------------------------------------------------------------

Remarque, on retrouve facilement la valeur en 00446894:
4C XOR 03 = 4F
75 XOR 03 = 76
63 XOR 03 = 60
69 XOR 03 = 6A
66 XOR 03 = 65
65 XOR 03 = 66
72 XOR 03 = 71
34 XOR 03 = 37
38 XOR 03 = 3B

(((((((4F*2 +76)*2 +60)*2 +6A)*2 + 65)*2 +66)*2 +71)*2 +37)*2 + 3B = BB2D (c'est bon!!)


On continue juste aprs la boucle:

XXXX:00444848  E813FCFFFF     CALL 00444460           ; explorer
XXXX:0044484D  E81EFEFFFF     CALL 00444670           ; explorer
XXXX:00444852  A150684400     MOV  EAX,[00446850]
XXXX:00444857  3B0554684400   CMP  EAX,[00446854]     ;en [00446854]: longueur du nom (moi c'est 9)
XXXX:0044485D  7546           JNZ  004448A5

La situation est simple:
Si on excute le saut, le serial ne va pas, dans le cas contraire (EAX et [00446854] ont mme
valeur) alors le crackme est enregistr a notre nom alors c'est fini.

Il nous reste donc deux call  explorer. Allons y.

==============================
3. SERIAL/NAME : CALL 00444460
==============================

Une autre boucle:

XXXX:00444492  B870684400     MOV  EAX,00446870       ;notre serial encod
XXXX:00444497  8BCE           MOV  ECX,ESI            ;ESI vaut initialement 00000001
XXXX:00444499  0208           ADD  CL,[EAX]           ; +1 / +2 / +3 / +4 / ...
XXXX:0044449B  80C104         ADD  CL,04              ;+4
XXXX:0044449E  8808           MOV  [EAX],CL
XXXX:004444A0  81E1FF000000   AND  ECX,000000FF
XXXX:004444A6  8B1D90684400   MOV  EBX,[00446890]     ;[00446890] est initialement nul
XXXX:004444AC  03DB           ADD  EBX,EBX
XXXX:004444AE  03CB           ADD  ECX,EBX
XXXX:004444B0  890D90684400   MOV  [00446890],ECX
XXXX:004444B6  46             INC  ESI
XXXX:004444B7  40             INC  EAX                ;caractre suivant
XXXX:004444B8  4A             DEC  EDX
XXXX:004444B9  75DC           JNZ  00444497           ;boucle

Rsultat pour moi:
-------------------------------------------------------------------------------
XXXX:00446870 1B 42 2D 38 34 36 42 09-0E                       .B-846B..
XXXX:00446880
XXXX:00446890 58 54 00 00                                      XT..
-------------------------------------------------------------------------------

En effet:  (((((((1B*2 +42)*2 +2D)*2 +38)*2 +34)*2 +36)*2 +42)*2 +09)*2 +0E = 5458 (c'est bon!!!)

XXXX:004444BB  8D4DFC         LEA  ECX,[EBP-04]       ;va stocker une adresse en [EBP-04]
XXXX:004444BE  BA01000000     MOV  EDX,00000001
XXXX:004444C3  A190684400     MOV  EAX,[00446890]     ;pour moi: EAX=00005458
XXXX:004444C8  E8F731FCFF     CALL 004076C4           ;conversion en ascii

Ce call va convertir la valeur de eax en ascii, et l'adresse du rsultat est stocke en [EBP-04]

XXXX:004444EC  A194684400     MOV  EAX,[00446894]     ;pour moi: [00446894]=0000BB2D
XXXX:004444F1  030598684400   ADD  EAX,[00446898]     ;pour moi: [00446898]=00000234
XXXX:004444F7  8B0D90684400   MOV  ECX,[00446890]     ;pour moi: [00446890]=00005458
XXXX:004444FD  0FAFCE         IMUL ECX,ESI            ;ESI vaut initialement 00000001
XXXX:00444500  2BC1           SUB  EAX,ECX
XXXX:00444502  A39C684400     MOV  [0044689C],EAX
XXXX:00444507  46             INC  ESI
XXXX:00444508  4A             DEC  EDX
XXXX:00444509  75E1           JNZ  004444EC           ;boucle
XXXX:0044450B  8D4DFC         LEA  ECX,[EBP-04]       ;va stocker une adresse en [EBP-04]
XXXX:0044450E  BA01000000     MOV  EDX,00000001
XXXX:00444513  A19C684400     MOV  EAX,[0044689C]     ;valeur  convertir (*)
XXXX:00444518  E8A731FCFF     CALL 004076C4           ;conversion en caractres ascii

(*) pour trouver cette valeur, c'est simple:
[00446894]+[00446898] - [00446890]*(longueur du nom -2)
Exemple pour moi:
BB2D+234 - 5458*7 = BD61 - 24E68 = FFFE6EF9 (codage sur 32bits, a va de soit)

Et ensuite cette valeur est transform en caractres ascii, (si par exemple EAX=3A alors aprs
appel, on pourra trouver en mmoire: 38 41) on peut donc prvoir que cette valeur est susceptible
d'apparaitre dans le serial final.

==============================
4. SERIAL/NAME : CALL 00444670
==============================

XXXX:004446A1  A194684400     MOV  EAX,[00446894]     ;pour moi: [00446894]=0000BB2D
XXXX:004446A6  83C00C         ADD  EAX,0C
XXXX:004446A9  8BD3           MOV  EDX,EBX            ;EBX vaut initialement 00000001
XXXX:004446AB  0FAFD3         IMUL EDX,EBX
XXXX:004446AE  2BC2           SUB  EAX,EDX            ;EAX: valeur qui va etre convertie
XXXX:004446B0  8D55FC         LEA  EDX,[EBP-04]       ;[EBP-04]: future adresse d'un bout de serial
XXXX:004446B3  E8DC2FFCFF     CALL 00407694           ;conversion DECIMALE en ascii (*)
...
(*) on a donc une premire partie de serial

XXXX:004446C6  A198684400     MOV  EAX,[00446898]     ;pour moi: [00446898]=00000234
XXXX:004446CB  5A             POP  EDX                ;EDX=EBX SHL 05
XXXX:004446CC  2BC2           SUB  EAX,EDX
XXXX:004446CE  03C3           ADD  EAX,EBX            ;ajoute le compteur de boucle
XXXX:004446D0  8D55F8         LEA  EDX,[EBP-08]       ;[EBP-04]: future adresse d'un bout de serial
XXXX:004446D3  E8BC2FFCFF     CALL 00407694           ;conversion DECIMALE en ascii (**)

(**) on a une deuxime partie de serial

XXXX:004446D8  FF75F8         PUSH DWORD PTR [EBP-08] ;partie (**)
XXXX:004446DB  6844474400     PUSH 00444744           ;"-"
XXXX:004446E0  FF3560684400   PUSH DWORD PTR [00446860] ;fabriqu dans le call 00444460
XXXX:004446E6  6850474400     PUSH 00444750           ;"H3"
XXXX:004446EB  8BC6           MOV  EAX,ESI            ;d *eax : adresse du serial final
XXXX:004446ED  BA09000000     MOV  EDX,00000009
XXXX:004446F2  E8FDF3FBFF     CALL 00403AF4           ;concatnation => donne serial final
XXXX:004446F7  43             INC  EBX
XXXX:004446F8  83C604         ADD  ESI,04
XXXX:004446FB  83FB0D         CMP  EBX,0D             ;12 boucles
XXXX:004446FE  7591           JNZ  00444691

/* Remarque: tout petit retour en arrire pour tre complet:
XXXX:00444691  FF3564684400   PUSH DWORD PTR [00446864] ;fabriqu dans le call 00444460
XXXX:00444697  6838474400     PUSH 00444738             ;"65A"
XXXX:0044469C  6844474400     PUSH 00444744             ;"-"
*/

On cherche un serial et on tombe sur 12 serials! Lequel est le bon.

545865A-47928-533-FFFE6EF9H3
545865A-47925-502-FFFE6EF9H3
545865A-47920-471-FFFE6EF9H3
545865A-47913-440-FFFE6EF9H3
545865A-47904-409-FFFE6EF9H3
545865A-47893-378-FFFE6EF9H3         ;C'est dommage y'en n'a pas un seul de bon!
545865A-47880-347-FFFE6EF9H3
545865A-47865-316-FFFE6EF9H3
545865A-47848-285-FFFE6EF9H3
545865A-47829-254-FFFE6EF9H3
545865A-47808-223-FFFE6EF9H3
545865A-47785-192-FFFE6EF9H3

Remarque: on reconnait nos 2 chaines (pour moi 5458 et FFFE6EF9) issues du CALL 00444460
          et les chaines issues des 2 call 00407694.

Dernire ligne droite:
XXXX:00444705  33C0           CALL 0044454C             ;vrification

==============================
5. SERIAL/NAME : CALL 0044454C
==============================

Souvenons nous que pour tre enregistr il faut que [00446850]=[00446854] (c'est la longueur du
nom).

On survolant le call on s'appercoit, qu'il n'arrte pas de comparer notre serial avec ceux
calculs prcdemment (call 00403B44 est le call de comparaison de 2 chanes).
Comme on est un peu perdu, on va donc cherche dans le call une hypothtique instruction mov
qui met en jeu l'oprante [00446850]. Et on trouve (le call 0044454C n'est pas vraiment long):

XXXX:004445C2  8B55FC         MOV  EDX,[EBP-04]       ;le VRAI serial
XXXX:004445C5  8B07           MOV  EAX,[EDI]          ;mon serial
XXXX:004445C7  E878F5FBFF     CALL 00403B44           ;call de comparaison
XXXX:004445CC  752A           JNZ  004445F8
XXXX:004445CE  A154684400     MOV  EAX,[00446854]     ;voil ce que l'on cherchait!!!
XXXX:004445D3  A350684400     MOV  [00446850],EAX     ;super!

On voit donc que le VRAI serial est crit tel quel en mmoire pour moi c'est

5458-47917-564-FFFE6EF9
----
(1)  -----                     (1): voir partie "3. SERIAL/NAME : CALL 00444460"
      (2)  ---                 (2): (en effet 47917d = BB2Dh) voir partie "2. SERIAL/NAME : INTRO"
           (3) --------        (3): (en effet 564d = 234h) voir partie "2. SERIAL/NAME : INTRO"
                 (4)           (4): voir partie "3. SERIAL/NAME : CALL 00444460"


=============
6. CONCLUSION
=============

Your Name/ Lucifer48
 Reg. No./ 5458-47917-564-FFFE6EF9

	Un bon crackme de tC, on a t promens avec des comparaisons de serials qui ne servent 
rien; le fait que a soit du delphi complique la tche du cracker, mais nanmoins, un simple
D EDX suffit pour trouver un bon serial, ce qui justifie le "rating" du crackme, c'est  dire
un 3/10.

Lucifer48